home *** CD-ROM | disk | FTP | other *** search
/ The Whacked Mac Archives / The Whacked Mac Archives Version 1.0 (L0pht Heavy Industries, Inc.)(1996).iso / Pub (Expanded) / AOLCrap / No Dice ƒ / No Dice INIT.c < prev    next >
C/C++ Source or Header  |  1995-03-29  |  6KB  |  322 lines

  1. // -------------------------------------------------------------------------
  2. // -- No Dice 1.0.0
  3. // -- by Andrew Welch
  4. // -- Copyright 1995 by Ambrosia Software, Inc.
  5.  
  6. // -- Ignore those annoying dice rolls that people seem to love using in
  7. // -- chat rooms.
  8.  
  9.  
  10. // -------------------------------------------------------------------------
  11. // -- #include files for No Dice INIT
  12.  
  13. #include "Assembler.h"
  14. #include "A4Stuff.h"
  15.  
  16.  
  17. // -------------------------------------------------------------------------
  18. // -- #defines for No Dice INIT
  19.  
  20. #define    AOL_CREATOR                'AOqc'
  21. #define    INIT_RES_ID                128
  22.  
  23. #define    JMP                        0x4EF9
  24. #define    TESTYLEINSERT_SELECTOR    7
  25.  
  26. #define    ONLINE_HOST_LEN            10
  27. #define    ROOM_NAME_LEN            17
  28.  
  29. #define    RETURN_CHAR                0x0D
  30. #define    BLANK_LINE                0x0D202020
  31.  
  32.  
  33. // -------------------------------------------------------------------------
  34. // -- function prototypes for No Dice INIT
  35.  
  36. asm        void    main(void);
  37.         Boolean    IsAOLRunning(void);
  38.         Boolean    TrapAvailable(short theTrap);
  39.         Boolean    InAOLChatRoom(TEHandle theTE);
  40.         Boolean    CensorInsertion(long textLenth, char *theText);
  41.  
  42.  
  43. // -------------------------------------------------------------------------
  44. // -- Globals used in No Dice
  45.  
  46. static    char    gOnlineHostName[10] = {"OnlineHost"};
  47. static    char    gRoomName[17] = {"People Connection"};
  48.  
  49.  
  50. // -------------------------------------------------------------------------
  51. // -- No Dice INIT main
  52.  
  53. asm void main(void)
  54. {
  55.     
  56. // -- Detach this code resource
  57.  
  58.     clr.l    -(SP)
  59.     move.l    #'INIT', -(SP)
  60.     move.w    #INIT_RES_ID, -(SP)
  61.     _Get1Resource
  62.     tst.l    (SP)
  63.     beq        @skipOut
  64.     _DetachResource
  65.     
  66. // -- Now patch _TEDispatch
  67.  
  68.     move.l     #_TEDispatch, D0
  69.     _GetTrapAddress + newToolTrap
  70.  
  71.     lea        @origTEDispatch,A1
  72.     move.w    #JMP, (A1)+
  73.     move.l    A0, (A1)
  74.  
  75.     move     #_TEDispatch,D0
  76.     lea        @TEDispatchPatch, A0
  77.     _SetTrapAddress + newToolTrap
  78.  
  79.     rts
  80.     
  81. // -- There was some problem loading -- simply exit
  82.  
  83. @skipOut:
  84.  
  85.     rts
  86.  
  87. // -------------------------------------------------------------------------
  88. // -- Our patch to TEDispatch -- look for calls to TEStyleInsert
  89.  
  90. @TEDispatchPatch:
  91.     
  92. // -- See if TEStyleInsert is being called
  93.  
  94.     cmp.w    #TESTYLEINSERT_SELECTOR, 4(SP)
  95.     bne        @origTEDispatch
  96.  
  97. // -- Now make sure that AOL is the frontmost application
  98.  
  99.     jsr        IsAOLRunning
  100.     tst.b    D0
  101.     beq        @origTEDispatch
  102.  
  103. // -- See if we are in a chat room
  104.     
  105.     move.l    6(SP), -(SP)
  106.     jsr        InAOLChatRoom
  107.     add.l    #4, SP
  108.     tst.b    D0
  109.     beq        @origTEDispatch
  110.  
  111. // -- See if we should automatically ignore this insertion
  112.  
  113.     lea        @autoIgnore, A0
  114.     tst.w    (A0)
  115.     beq        @noAutoIgnore
  116.  
  117.     sub.w    #1, (A0)
  118.     lea        @blankIgnore, A0
  119.     move.w    #1, (A0)
  120.     bra        @censorIt
  121.  
  122. // -- See if we should ignore the next line if it is blank
  123.  
  124. @noAutoIgnore:
  125.  
  126.     lea        @blankIgnore, A0
  127.     tst.w    (A0)
  128.     beq        @noBlankIgnore
  129.  
  130.     sub.w    #1, (A0)
  131.  
  132. // -- Verify that this is indeed a blank line
  133.  
  134.     move.l    18(SP), A0
  135.     cmp.l    #BLANK_LINE, (A0)
  136.     bne        @noBlankIgnore
  137.  
  138. // -- Ignore this blank line and the next one too
  139.  
  140.     lea        @autoIgnore, A0
  141.     move.w    #1, (A0)
  142.     bra        @censorIt
  143.  
  144. // -- Finally, see if we should censor this insertion
  145.  
  146. @noBlankIgnore:
  147.  
  148.     move.l    18(SP), -(SP)
  149.     move.l    18(SP), -(SP)
  150.     jsr        CensorInsertion
  151.     add.l    #8, SP
  152.     tst.b    D0
  153.     beq        @origTEDispatch
  154.  
  155. // -- Make sure the next insertion is ignored as well
  156.  
  157.     lea        @autoIgnore, A0
  158.     move.w    #1, (A0)
  159.     
  160. // -- We _should_ censor this insertion -- simple set the length to 0
  161.  
  162. @censorIt:
  163.  
  164.     clr.l    14(SP)
  165.  
  166. @origTEDispatch:
  167.  
  168.     nop
  169.     nop
  170.     nop
  171.  
  172. @autoIgnore:    dc.w    0
  173. @blankIgnore:    dc.w    0
  174.  
  175. }    // -- main
  176.  
  177.  
  178.  
  179. // -------------------------------------------------------------------------
  180. // -- Use the process manager to find out if AOL is the current process
  181.  
  182. Boolean IsAOLRunning(void)
  183. {
  184. OSErr    err;
  185. Boolean    result = false;
  186.  
  187. // -- Make sure the process manager is up and running first
  188.  
  189. if (TrapAvailable(_OSDispatch))
  190.     {
  191.     ProcessSerialNumber    theProcess;
  192.     FSSpec                processSpec;
  193.     char                processName[32];
  194.     
  195. // -- Get the current process's serial number
  196.     
  197.     err = GetCurrentProcess(&theProcess);
  198.     if (err == noErr)
  199.         {
  200.         ProcessInfoRec    processInfo;
  201.  
  202. // -- Setup the ProcessInfoRec
  203.  
  204.         processInfo.processInfoLength = sizeof(processInfo);
  205.         processInfo.processName = (StringPtr)&processName;
  206.         processInfo.processAppSpec = &processSpec;
  207.  
  208. // -- Get information on the current process
  209.     
  210.         err = GetProcessInformation(&theProcess, &processInfo);
  211.         if (err == noErr)
  212.             {
  213.     
  214.     // -- See if this process has the same creator as AOL does
  215.     
  216.             if (processInfo.processSignature == AOL_CREATOR)
  217.                 result = true;
  218.             }
  219.         }
  220.     }
  221.  
  222. return result;
  223. }    // -- DrawMenuBarPatch
  224.  
  225.  
  226. // -------------------------------------------------------------------------
  227. // -- Is this TERec in an AOL Chat Room window?
  228.  
  229. Boolean InAOLChatRoom(TEHandle theTE)
  230. {
  231. Boolean    result = false;
  232. long    oldA4;
  233.  
  234. oldA4 = SetCurrentA4();
  235.  
  236. if (theTE != nil)
  237.     {
  238.     WindowPtr    theWindow;
  239.     Str255        theTitle;
  240.     short        index;
  241.     
  242. // -- Get the window's title that the TERec is drawn in
  243.  
  244.     theWindow = (WindowPtr)(**theTE).inPort;
  245.     GetWTitle(theWindow, (StringPtr)&theTitle);
  246.  
  247. // -- Now see if it matches what we're looking for
  248.  
  249.     for (index = 0; index < ROOM_NAME_LEN; index++)
  250.         {
  251.         if (theTitle[index + 1] != gRoomName[index])
  252.             goto NoMatch;
  253.         }
  254.  
  255.     result = true;
  256.  
  257. NoMatch:
  258.  
  259.     index = 0;
  260.     }
  261.  
  262. SetA4(oldA4);
  263.  
  264. return result;
  265. }    // -- InAOLChatRoom
  266.  
  267.  
  268. // -------------------------------------------------------------------------
  269. // -- Should this text insertion be censored?
  270.  
  271. Boolean    CensorInsertion(long textLenth, char *theText)
  272. {
  273. Boolean    result = false;
  274. long    oldA4;
  275.  
  276. oldA4 = SetCurrentA4();
  277.  
  278. if (textLenth > 10)
  279.     {
  280.     short    index;
  281.  
  282. // -- Ignore any return characters
  283.  
  284.     while ((*theText) == RETURN_CHAR)
  285.         theText++;
  286.  
  287. // -- Loop through and see if this is an online host message
  288.  
  289.     for (index = 0; index < ONLINE_HOST_LEN; index++)
  290.         {
  291.         if ((*theText) != gOnlineHostName[index])
  292.             goto NoMatch;
  293.         theText++;
  294.         }
  295.  
  296.     result = true;
  297.  
  298. NoMatch:
  299.  
  300.     index = 0;
  301.     }
  302.  
  303. SetA4(oldA4);
  304.  
  305. return result;
  306. }    // -- CensorInsertion
  307.  
  308.  
  309. // -------------------------------------------------------------------------
  310. // -- Is the theTrap available?
  311.  
  312. Boolean    TrapAvailable(short theTrap)
  313. {
  314. Boolean    result = true;
  315.  
  316. if (GetTrapAddress(_Unimplemented) == GetTrapAddress(theTrap))
  317.     result = false;
  318.  
  319. return result;
  320. }    // -- TrapAvailable
  321.  
  322.